package com.ruoyi.common.utils.security;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA加密解密
 * 
 * @author ruoyi
 **/
public class RsaUtils
{
    // Rsa 私钥
    public static String privateKey = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY"
            + "7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN"
            + "PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA"
            + "kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow"
            + "cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv"
            + "DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh"
            + "YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3" + "UP8iWi1Qw0Y=";
    // Rsa 私钥
//    public static String privateKey = "-----BEGIN PRIVATE KEY-----\n" +
//            "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC41Oc7POytSr0c\n" +
//            "kKG/wumKHX23mhnGXVbPuir9uxa/fZ2qcoAXKKUkL0OxrYIB4/vNwOD8C31IGbOt\n" +
//            "7QaAkSC8ai3o3dxfLgFiuunFJjk8Ty+ROeX8aEm91Kknhh76HtByXXm6Qo2zk9KU\n" +
//            "FO0E1Gu9IKsAPOtR4wDJoGLtYITat5FE2glx/3f7liAvOL6CeolF29EEmS70LGeZ\n" +
//            "3Vr1FAgCPdNeE3L+ZpjZdMk0Dr5V9upJlVUcibzbORSUU/paPKYSVtcHQP9lVIWo\n" +
//            "9NkR6hDdmYI32d66StRXuTh1z7UwgO7CsMpUISQx9YXcYaPhDdvNFW8Fu4xpAovW\n" +
//            "IwGhUKFXAgMBAAECggEAMSEGRYywLG/NTKZ1GA+rG/cyz3a6myt8Q8LsYn00UroF\n" +
//            "CqVcvssi+jdF+xhvkikTaWF3bAdxyZRrWjPCorHwzaQ7h8ZRKUuFOsUMFkdOt2Uk\n" +
//            "86k8JJdj4n2AaO0RltJR/dQy4vuFxtHoC0x0o/ACo0bnrSyEMEPylaV4Jjidl7T3\n" +
//            "mEJ+MzvzooASDEoM9/oEF8OJ+7xfAFPwHSp8xZ52gsH+QhIHZCh/8R00RJFSfX9i\n" +
//            "SAPLw2SJJN6LOHcJBAXNDn6Wi7zUxSxEtUp1HlsN0E5gIKXfMiAeWeO5Llb1vmG0\n" +
//            "hBhxRntKBZO9f2HOb+f+960I1qkr1rZwiZVERLA+oQKBgQDoUtNEkkvjpFmaSMQo\n" +
//            "jq+varWsJk3dqfk7S2vg95wM8PbDufALqUooDIogzB8oQfVy0lXwiiWcscSJhkQz\n" +
//            "pDd07jOUri1SlQ0T8rkuxoJOcbQ17wsXfM9OHKVaAahFFTYECeA70gx+1YTN5IF/\n" +
//            "3fokl0fht+hOCVSYAxPMlpZvnQKBgQDLqwtvftqv0K+6zLT+UjZ7Toui9/Kh7gsx\n" +
//            "sr9k8bkrT3Zs3r2g92mfCfmvnDq5iqk8kvZyR7t4I7L4K7bByX6uOiC3WcqZrf5K\n" +
//            "XPQ1XPqY0AAYvv2wfb4PSIIo17r7ZxJxTv29m+/XIzfypYfhccnXi69Udx6+On7C\n" +
//            "vYSv7a5UgwKBgE9gvT6YncVRyiuk4SDaX7yXwSroi4JJKRbRVjKvZ2okiqulRBc3\n" +
//            "6FZ2slsyYxLmNm7c3vAow2EefABhF7xtR2V0XbtXJ7UnqChArnUE7lDPGLu0yR1l\n" +
//            "T49oyjZOiqfP73zBwxOtWQec/Js8j+KYfXczGSROKdk/5t9pbcJhUVUhAoGAPucP\n" +
//            "/BqQzjZE4AuzZszbeM/0fpvXuz17BZlwVWv2xbKgH9XXeWyQmYcKL7uvw3hY9pVp\n" +
//            "Ojh/ZQaZkt5lboqd7o+TZS19TmOXoz38SrLxztqG/R2X2rerSKsbUCP44wadgpNj\n" +
//            "+Pi9ZZPCBtYrFmz/auwAdbTosNX+KoVAAtoEuqMCgYBHq+y7++YaIeL/SjD1Qgv5\n" +
//            "NBzMrf8PCacwJtJfSC/zhIxcexwb04fnkyQoOa70XKQPq+30w/QsQNbSWQx6xiOa\n" +
//            "4RKWdQYNWzTgPZxmrJ4KByB7XHFuIVt69jmBApuYWbOw+Lz8eW4lpIwuGvdzFO4d\n" +
//            "pVD5BeXmSuUEb2yeBK46aA==\n" +
//            "-----END PRIVATE KEY-----\n";

    /**
     * 私钥解密
     *
     * @param text 待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String text) throws Exception
    {
        return decryptByPrivateKey(privateKey, text);
    }

    /**
     * 公钥解密
     *
     * @param publicKeyString 公钥
     * @param text 待解密的信息
     * @return 解密后的文本
     */
    public static String decryptByPublicKey(String publicKeyString, String text) throws Exception
    {
        X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    /**
     * 私钥加密
     *
     * @param privateKeyString 私钥
     * @param text 待加密的信息
     * @return 加密后的文本
     */
    public static String encryptByPrivateKey(String privateKeyString, String text) throws Exception
    {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }

    /**
     * 私钥解密
     *
     * @param privateKeyString 私钥
     * @param text 待解密的文本
     * @return 解密后的文本
     */
    public static String decryptByPrivateKey(String privateKeyString, String text) throws Exception
    {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] result = cipher.doFinal(Base64.decodeBase64(text));
        return new String(result);
    }

    /**
     * 公钥加密
     *
     * @param publicKeyString 公钥
     * @param text 待加密的文本
     * @return 加密后的文本
     */
    public static String encryptByPublicKey(String publicKeyString, String text) throws Exception
    {
        X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] result = cipher.doFinal(text.getBytes());
        return Base64.encodeBase64String(result);
    }

    /**
     * 构建RSA密钥对
     *
     * @return 生成后的公私钥信息
     */
    public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException
    {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
        String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
        String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
        return new RsaKeyPair(publicKeyString, privateKeyString);
    }

    /**
     * RSA密钥对对象
     */
    public static class RsaKeyPair
    {
        private final String publicKey;
        private final String privateKey;

        public RsaKeyPair(String publicKey, String privateKey)
        {
            this.publicKey = publicKey;
            this.privateKey = privateKey;
        }

        public String getPublicKey()
        {
            return publicKey;
        }

        public String getPrivateKey()
        {
            return privateKey;
        }
    }
}
